package br.com.divulgaqui.managedbean;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;

import br.com.divulgaqui.client.EspecificacaoServiceBeanLocal;
import br.com.divulgaqui.client.exception.EntityIgualException;
import br.com.divulgaqui.entity.Especificacao;

import com.ocpsoft.pretty.faces.annotation.URLAction;
import com.ocpsoft.pretty.faces.annotation.URLMapping;
import com.ocpsoft.pretty.faces.annotation.URLMappings;

@ManagedBean
@ViewScoped
@URLMappings(mappings={
		  @URLMapping(id = "cadastroEspecificacao", pattern = "/admin/especificacao/cadastro", viewId = "/admin/especificacao/cadastro.jsf")
		})
public class EspecificacaoManagedBean extends BaseBean{	
	
	private static final long serialVersionUID = 1L;
	private Especificacao especificacao;
	private Especificacao especificacaoSelecionada;
	private List<Especificacao> especificacoes;
	private List<Especificacao> especificacoesComplete;
	
	@EJB
	private EspecificacaoServiceBeanLocal especificacaoServiceBeanLocal;
	
	public EspecificacaoManagedBean(){
	}
	
	@PostConstruct
	public void init(){
		especificacao = new Especificacao();
		especificacaoSelecionada = new Especificacao();
		especificacoes = new ArrayList<Especificacao>();
	}
	
	/**
	 * Inclui uma especificação
	 */
	public void salvar(){
		try {
			especificacaoServiceBeanLocal.salvar(especificacao);
			especificacao = new Especificacao();
			carregarEspecificacoes();
			addMensagem(FacesMessage.SEVERITY_INFO, "Especificação", "Cadastrado com sucesso.");
		} catch (EntityIgualException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Especificacao", "Especificacao com nome \""+especificacao.getCampo()+"\" já foi cadastrada.");
		}
	}
	
	/**
	 * Atualiza uma especificação
	 */
	public void atualizar(){
		try {
			especificacaoServiceBeanLocal.atualizar(especificacaoSelecionada);
			addMensagem(FacesMessage.SEVERITY_INFO, "Especificação", "Atualizada com sucesso.");
			especificacaoSelecionada = new Especificacao();
			carregarEspecificacoes();
		} catch (EntityIgualException e) {
			addMensagem(FacesMessage.SEVERITY_ERROR, "Especificação", "Especifcação com nome \""+especificacaoSelecionada.getCampo()+"\" já foi cadastrada.");
			carregarEspecificacoes();
		}
	}	
	
	/**
	 * Exclui uma especificação
	 */
	public void excluir(){		
		especificacaoServiceBeanLocal.excluir(especificacaoSelecionada);
		addMensagem(FacesMessage.SEVERITY_INFO, "Especificação", "Excluida com sucesso.");
		carregarEspecificacoes();
	}
	
	/**
	 * Lista especificações
	 */
	@URLAction(mappingId="cadastroEspecificacao",onPostback=false)
	public void carregarEspecificacoes(){
		especificacoes = especificacaoServiceBeanLocal.listar();
	}
	
	/**
	 * Pesquisa as especificações que conferem com o texto informado
	 * e retorna a lista
	 * @param texto
	 * @return result
	 */
	public List<Especificacao> complete(String texto){
		if(especificacoesComplete == null){
			especificacoesComplete = especificacaoServiceBeanLocal.listar();
		}
		List<Especificacao> result = new ArrayList<Especificacao>();		
		for (Especificacao especificacao : especificacoesComplete) {
			if ((especificacao.getCampo() != null && especificacao.getCampo().toLowerCase()
					.indexOf(texto.toLowerCase()) == 0)
					|| "".equals(texto)) {
				result.add(especificacao);
			}
		}
		return result;
	}	
	
	//====================== Get e Set ====================//
	

	public Especificacao getEspecificacao() {
		return especificacao;
	}

	public void setEspecificacao(Especificacao especificacao) {
		this.especificacao = especificacao;
	}

	public Especificacao getEspecificacaoSelecionada() {
		return especificacaoSelecionada;
	}

	public void setEspecificacaoSelecionada(Especificacao especificacaoSelecionada) {
		this.especificacaoSelecionada = especificacaoSelecionada;
	}

	public List<Especificacao> getEspecificacoes() {
		return especificacoes;
	}

	public void setEspecificacoes(List<Especificacao> especificacoes) {
		this.especificacoes = especificacoes;
	}

	public List<Especificacao> getEspecificacoesComplete() {
		return especificacoesComplete;
	}

	public void setEspecificacoesComplete(List<Especificacao> especificacoesComplete) {
		this.especificacoesComplete = especificacoesComplete;
	}
		
}
